package com.cloud.springcloudhysyrix;

import com.cloud.springcloudhysyrix.RibbonRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 这里只是使用了Ribbon均很负载，只是为演示。
 * 	实际开发中不会使用 RestTemplate 去请求服务，因为太麻烦了！会配合其他的组件去请求服务
 */

@SpringBootApplication
@EnableEurekaClient // 启动Eureka组件客户端
// 和服务中心对接后，选择什么样的均衡负载算法，name表示配置文件中的 hello-service
@RibbonClient(name = "hello-service",configuration = RibbonRuleConfig.class)
// @EnableDiscoveryClient 注册中心不是eureka使用这个注解代替 @EnableEurekaClient
@EnableCircuitBreaker // 启动允许短路器(Hystrix里面的)
@EnableHystrixDashboard // 开启Hystrix监控中心
public class SpringCloudHysyrixApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudHysyrixApplication.class, args);
	}


	/**
	 * RestTemplate本身是面向IP调用的，
	 * 		但是加上了 @LoadBalanced 注解后，RestTemple就会变成面向服务调用
	 * @return
	 */
	@Bean
	@LoadBalanced
	RestTemplate restTemplate(){
		return new RestTemplate();
	}


	/**
	 * 自定义选择用什么样的均很负载算法
	 * @return
	 */
//	@Bean
//	public IRule ribbonRule(){
//		return new RandomRule();
//	}

}
